package webapp.lib;
public class ElfProef {

	private String bsnNr;

	public ElfProef() {

	}

	public ElfProef(String bsnNr) {
		this.bsnNr = bsnNr;
	}

	/**
	 * 
	 * @return boolean met true als hij geldig is.
	 */
	public boolean check() throws CustomException {
		return check(bsnNr);
	}

	/**
	 * 
	 * @param bsn
	 *            String met het Burger Service Nummer
	 * @return boolean met true als hij geldig is.
	 */
	public boolean check(String bsn) throws CustomException {
		if (bsn.matches("[0-9]{9}")) {
			// 9xA 8xB 7xC 6xD 5xE 4xF 3xG 2xH -1xI
			int som = 0;
			som += 9 * getIntAt(bsn, 0);
			som += 8 * getIntAt(bsn, 1);
			som += 7 * getIntAt(bsn, 2);
			som += 6 * getIntAt(bsn, 3);
			som += 5 * getIntAt(bsn, 4);
			som += 4 * getIntAt(bsn, 5);
			som += 3 * getIntAt(bsn, 6);
			som += 2 * getIntAt(bsn, 7);
			som += -1 * getIntAt(bsn, 8);
			if ((float) (((float) som / 11) % (som / 11)) == 0) {
				//System.out.println(bsn + " is een geldig BSN nummer");
				return true;
			}
		}
		//System.out.println(bsn + " is GEEN geldig BSN nummer");
		throw new CustomException("De opgegeven BSN is niet geldig.");
	}

	/**
	 * 
	 * @return Genereerd een BSN nummer
	 */
	public String generateBSN() {
		int nr9 = (int) Math.floor(Math.random() * 3);
		int nr8 = (int) Math.floor(Math.random() * 10);
		int nr7 = (int) Math.floor(Math.random() * 10);
		int nr6 = (int) Math.floor(Math.random() * 10);
		int nr5 = (int) Math.floor(Math.random() * 10);
		int nr4 = (int) Math.floor(Math.random() * 10);
		int nr3 = (int) Math.floor(Math.random() * 10);
		int nr2 = (int) Math.floor(Math.random() * 10);
		int nr1 = 0;
		int SofiNr = 0;
		if ((nr9 == 0) && (nr8 == 0) && (nr7 == 0)) {
			nr8 = 1;
		}
		SofiNr = 9 * nr9 + 8 * nr8 + 7 * nr7 + 6 * nr6 + 5 * nr5 + 4 * nr4 + 3
				* nr3 + 2 * nr2;
		nr1 = (int) Math.floor(SofiNr - (Math.floor(SofiNr / 11)) * 11);
		if (nr1 > 9) {
			if (nr2 > 0) {
				nr2 -= 1;
				nr1 = 8;
			} else {
				nr2 += 1;
				nr1 = 1;
			}
		}
		return "" + nr9 + nr8 + nr7 + nr6 + nr5 + nr4 + nr3 + nr2 + nr1;
	}

	/**
	 * 
	 * @param bsn
	 *            nummer
	 * @param positie
	 *            van het cijfer dat hij moet terug geven
	 * @return een int op de opgegeven positie
	 */
	private int getIntAt(String bsn, int positie) {
		return Integer.parseInt(bsn.trim().charAt(positie) + "");
	}

}
